package com.leiqichao.backend.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;

/**
 * 文章实体类
 *
 * <p>对应数据库表 articles（文章表）
 *
 * <p>包含文章基本信息、SEO信息、状态控制等字段
 *
 * @see TableName 指定数据库表名
 */
@Data
@TableName("articles")
public class Article {

    /**
     * 文章ID（自增主键）
     *
     * @see TableId 标识主键字段，使用数据库自增策略
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 文章标题
     *
     * @apiNote 最大长度255字符，非空
     */
    @TableField("title")
    private String title;

    /**
     * URL别名（唯一标识）
     *
     * @apiNote 用于生成友好URL，需保证唯一性
     * @see TableField 对应数据库唯一索引 uniq_slug
     */
    @TableField("slug")
    private String slug;

    /**
     * 文章正文内容
     *
     * @apiNote 长文本类型，支持富文本格式
     */
    @TableField("content")
    private String content;

    /**
     * 摘要（最大500字符）
     *
     * @apiNote 用于列表页预览，自动截取或手动填写
     */
    @TableField("excerpt")
    private String excerpt;

    /**
     * 封面图URL
     *
     * @apiNote 文章封面图片地址，支持绝对/相对路径
     */
    @TableField("cover_image")
    private String coverImage;

    /**
     * 分类ID
     *
     * @apiNote 关联分类表的外键字段
     * @see TableField 对应普通索引 idx_category_id
     */
    @TableField("category_id")
    private Long categoryId;

    /**
     * 文章状态（枚举）
     *
     * @apiNote 默认值 draft（草稿）
     * @see Enum 可选值: draft（草稿）, published（已发布）, archived（归档）
     */
    @TableField("status")
    private String status = "draft";

    /**
     * 是否置顶
     *
     * @apiNote 默认 false（不置顶）
     * @see Boolean 对应数据库 tinyint(1) 类型
     */
    @TableField("is_top")
    private Boolean isTop = false;

    /**
     * SEO标题
     *
     * @apiNote 专门为搜索引擎优化的标题，可不填
     */
    @TableField("meta_title")
    private String metaTitle;

    /**
     * SEO描述
     *
     * @apiNote 用于搜索引擎结果展示，建议150-160字符
     */
    @TableField("meta_description")
    private String metaDescription;

    /**
     * SEO关键词
     *
     * @apiNote 逗号分隔的关键词列表
     */
    @TableField("meta_keywords")
    private String metaKeywords;

    /**
     * 是否允许评论
     *
     * @apiNote 默认 true（允许评论）
     */
    @TableField("allow_comment")
    private Boolean allowComment = true;

    /**
     * 阅读量统计
     *
     * @apiNote 默认0，每次访问+1
     */
    @TableField("view_count")
    private Integer viewCount = 0;

    /**
     * 作者名称
     *
     * @apiNote 最大50字符，非空
     */
    @TableField("author_name")
    private String authorName;

    /**
     * 语雀原始文档URL
     *
     * @apiNote 来源文档的完整URL地址
     */
    @TableField("source_url")
    private String sourceUrl;

    /**
     * 嵌入参数（默认?view=doc_embed&from=anything）
     *
     * @apiNote 用于文档嵌入的URL参数
     */
    @TableField("embed_query")
    private String embedQuery = "?view=doc_embed&from=anything";

    /**
     * 嵌入文档类型（枚举）
     *
     * @apiNote 默认 doc（普通文档）
     * @see Enum 可选值: doc（文档）, table（表格）, datasheet（数据表）
     */
    @TableField("embed_type")
    private String embedType = "doc";

    /**
     * 软删除标记
     *
     * @apiNote 默认 false（未删除）
     * @see TableLogic 如需启用逻辑删除需添加此注解
     */
    @TableField("is_deleted")
    private Boolean isDeleted = false;

    /**
     * 发布时间
     *
     * @apiNote 文章正式发布时间，可为空（草稿状态时）
     */
    @TableField("published_at")
    private LocalDateTime publishedAt;

    /**
     * 创建时间（自动填充）
     *
     * @apiNote 记录首次创建时间
     * @see FieldFill 插入时自动填充
     */
    @TableField(value = "created_at", fill = FieldFill.INSERT)
    private LocalDateTime createdAt;

    /**
     * 最后更新时间（自动填充）
     *
     * @apiNote 记录最后修改时间
     * @see FieldFill 插入和更新时自动填充
     */
    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;

    /**
     * 全文检索字段（虚拟字段）
     *
     * @apiNote 数据库全文索引 ft_title_content 的映射字段
     * @see com.baomidou.mybatisplus.core.conditions.query.QueryWrapper 示例用法：
     *     queryWrapper.apply("MATCH(title,content) AGAINST({0} IN NATURAL LANGUAGE MODE)", keyword)
     */
    @TableField(exist = false)
    private String fulltextSearch;
}